/*!
 * \file symbolic.h
 *
 * \brief Declaration of the Symbolic class
 *
 * Symbolic represents a symbolic constant, including name, bounds, etc.
 *
 * Copyright (c) 2010, Colorado State University <br>
 * All rights reserved. <br>
 * See ../../COPYING for details. <br>
 *
 * \date Started: 1/6/11
 * \date Last Modified: 1/6/11
 * \authors Alan LaMielle
 */

#ifndef SYMBOLIC_H_
#define SYMBOLIC_H_

#include <iegenlib/iegenlib.h>

#include <climits>

namespace iegenlib{

/*!
 * \class Symbolic
 *
 * \brief A class that represents symbolic constants
 */
class Symbolic {
public:

  /*!
   * Symbolic constructor
   */
  Symbolic(string name,int lower_bound=INT_MIN,int upper_bound=INT_MAX);

  /*!
   * Symbolic equality operator
   */
  inline bool operator==(Symbolic const& other) const{
     return !(*this<other) && !(other<*this);}

  /*!
   * Symbolic not equals operator
   */
  inline bool operator!=(Symbolic const& other) const{
     return !(*this==other);}

  /*!
   * Symbolic less than operator
   */
  bool operator<(Symbolic const& other) const;

  /*!
   * Get the name of this symbolic constant.
   *
   * @return the set of name of this symbolic constant
   */
  inline string getName() const{return this->name;}

  /*!
   * Get the lower bound of this symbolic constant.
   *
   * @return the lower bound of this symbolic constant
   */
  inline const int getLowerBound() const {return this->lower_bound;}

  /*!
   * Get the upper bound of this symbolic constant.
   *
   * @return the upper bound of this symbolic constant
   */
  inline const int getUpperBound() const {return this->upper_bound;}

private:
  string name;

  //An integer representing the lower bound of the symbolic
  int lower_bound;

  //An integer representing the upper bound of the symbolic
  int upper_bound;
};

}//end namespace iegenlib

#endif /* SYMBOLIC_H_ */
